package com.luxsoft.siipap.em.replica.ui.dashboard;

import java.util.Date;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import com.jgoodies.binding.beans.Model;
import com.luxsoft.siipap.model.Periodo;

/**
 * Bean para mantener registradas las mediciones de ventas
 * 
 * @author Ruben Cancino
 *
 */
public class MedidorDeVentas extends Model{
	
	private Date fechaInicial;
	
	private Date fechaFinal;
	
	private Date lastUpdate;
	
	private double registrosSiipap;
	
	private double registrosSW;
	
	private double importeSiipap;
	
	private double importeSW;
	
	private double nivelTolerado;
	
	private double nivelDeAdvertencia;
	
	private double nivelDeAlarma;
	
	public MedidorDeVentas(){
		Periodo p=Periodo.periodoDeloquevaDelMes();
		fechaInicial=p.getFechaInicial();
		fechaFinal=p.getFechaFinal();
	}

	public Date getFechaInicial() {
		return fechaInicial;
	}
	
	public void setFechaInicial(Date fechaInicial) {
		Object old=this.fechaInicial;
		this.fechaInicial = fechaInicial;
		firePropertyChange("fechaInicial", old, fechaInicial);
	}

	public Date getFechaFinal() {
		return fechaFinal;
	}

	public void setFechaFinal(Date fechaFinal) {
		Object old=this.fechaFinal;
		this.fechaFinal = fechaFinal;
		firePropertyChange("fechaFinal", old, fechaFinal);
	}

	public Date getLastUpdate() {
		return lastUpdate;
	}

	public void setLastUpdate(Date lastUpdate) {
		Object old=this.lastUpdate;
		this.lastUpdate = lastUpdate;
		firePropertyChange("lastUpdate", old, lastUpdate);
	}

	public double getRegistrosSiipap() {
		return registrosSiipap;
	}

	public void setRegistrosSiipap(double registrosSiipap) {
		double old=this.registrosSiipap;
		this.registrosSiipap = registrosSiipap;
		firePropertyChange("registrosSiipap", old, registrosSiipap);
	}

	public double getRegistrosSW() {
		return registrosSW;
	}

	public void setRegistrosSW(double registrosSW) {
		double old=this.registrosSW;
		this.registrosSW = registrosSW;
		firePropertyChange("registrosSW", old, registrosSW);
	}

	public double getImporteSiipap() {
		return importeSiipap;
	}

	public void setImporteSiipap(double ventasSource) {
		double old=this.importeSiipap;
		this.importeSiipap = ventasSource;
		firePropertyChange("importeSiipap", old, importeSiipap);
	}

	public double getImporteSW() {
		return importeSW;
	}

	public void setImporteSW(double ventasTarget) {
		Object old=this.importeSW;
		this.importeSW = ventasTarget;
		firePropertyChange("importeSW", old, importeSW);
	}

	public double getNivelTolerado() {
		return nivelTolerado;
	}

	public void setNivelTolerado(double nivelTolerado) {
		this.nivelTolerado = nivelTolerado;
	}

	public double getNivelDeAdvertencia() {
		return nivelDeAdvertencia;
	}

	public void setNivelDeAdvertencia(double nivelDeAdvertencia) {
		this.nivelDeAdvertencia = nivelDeAdvertencia;
	}

	public double getNivelDeAlarma() {
		return nivelDeAlarma;
	}

	public void setNivelDeAlarma(double nivelDeAlarma) {
		this.nivelDeAlarma = nivelDeAlarma;
	}
	
	public double getDiferenciaRegistros(){
		if(registrosSW==0)
			return 100d;
		double res=100-(registrosSiipap/registrosSW)*100;
		return Math.abs(res);
	}
	
	public double getDiferenciaImportes(){
		if(importeSW==0)
			return 100d;
		double res=100-(importeSiipap/importeSW)*100;
		return Math.abs(res);
	}
	
	public double getDifEnImportes(){
		return importeSiipap-importeSW;
	}
	
	public double getDifEnRegistros(){
		return registrosSiipap-registrosSW;
	}

	
	//private transient Periodo periodo;
	
	public Periodo getPeriodo(){		
		return new Periodo(fechaInicial,fechaFinal);
	}
	
	public void setPeriodo(Periodo periodo) {
		setFechaInicial(periodo.getFechaInicial());
		setFechaFinal(periodo.getFechaFinal());
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((fechaFinal == null) ? 0 : fechaFinal.hashCode());
		result = prime * result
				+ ((fechaInicial == null) ? 0 : fechaInicial.hashCode());
		result = prime * result
				+ ((lastUpdate == null) ? 0 : lastUpdate.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MedidorDeVentas other = (MedidorDeVentas) obj;
		if (fechaFinal == null) {
			if (other.fechaFinal != null)
				return false;
		} else if (!fechaFinal.equals(other.fechaFinal))
			return false;
		if (fechaInicial == null) {
			if (other.fechaInicial != null)
				return false;
		} else if (!fechaInicial.equals(other.fechaInicial))
			return false;
		if (lastUpdate == null) {
			if (other.lastUpdate != null)
				return false;
		} else if (!lastUpdate.equals(other.lastUpdate))
			return false;
		return true;
	}
	
	public String toString(){
		return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE, false);
	}

}
